package Controle;

import Apoio.Arquivo;
import Apoio.Leitor;
import ElementosLogicos.Estado;
import ElementosLogicos.Testador;
import Modelo.AutomatoFinito;
import Modelo.ExprecaoRegular;
import Modelo.GramaticaRegular;
import Modelo.Modelo;

public class Controle {

	private Modelo modelo;
	private Arquivo arq = new Arquivo();
	private Leitor leitor = new Leitor();
	private Testador testador;
	
	public Controle(){
		testador = new Testador();
	}
	
	public GramaticaRegular gerarGR(String alfa, String simbolos){
		GramaticaRegular gr = null;
		if(testador.testaAlfabetoGR(alfa)){
			gr = new GramaticaRegular(alfa, simbolos);
			arq.grava("GR/", gr.getId(), "");
			//arq.grava("GR/", gr.getId(), gr.toString());
			System.out.println("Id: "+gr.getId()+" GR"/*+gr.toString()*/);
		}
		return gr;
	}
	
	public void addProducaoGR(GramaticaRegular gr, String prod){
		String p = gr.addProducao(prod);
		arq.atualiza("GR/", gr.getId(), p);
	}
	
	public void editarProducaoGR(GramaticaRegular gr, String novaProd, int linha){
		gr.editarProducao(novaProd, linha);
		arq.grava("GR/", gr.getId(), gr.toString());
		//arq.grava("GR/a", gr.getId(), gr.toString()); // teste
	}
	
	public AutomatoFinito gerarAF(String alfa){
		AutomatoFinito af = null;
		if(testador.testaAlfabetoAF(alfa)){
			af = new AutomatoFinito(alfa);
			arq.grava("AF/", af.getId(), af.toString());
			
			//arq.grava("AF/a", af.getId(), af.toString());// teste para ver se esta atualizando derieto o automato
			System.out.println("Id: "+af.getId()+" "+af.toString());
		}//TODO: verificar formatacao da string armazenada que ajude na leitura do arquivo
		return af;
	}
		
	public void addEstadoAF(AutomatoFinito af, Estado e){
		af.addEstado(e);
		arq.atualiza("AF/", af.getId(), e.toString());
	}
	
	public Estado geraEstadoAF(AutomatoFinito af, String nome){
		return af.geraEstado(nome);
	}
	
	public void gerarEstado(String nome){
		 Estado q = new Estado(nome);
	}
	
	public void geraTransicaoAF(Estado origem, char entrada, Estado destino){
		origem.geraTransicao(entrada, destino);
	}
	
	//TODO: edicao AF ?
//	public void editaAF(){
//		
//	}
	
	public ExprecaoRegular gerarER(String alfa, String expr){
		ExprecaoRegular er = null;
		if(testador.testaAlfabetoER(alfa) && testador.testaER(expr)){
			er = new ExprecaoRegular(alfa,expr);
			arq.grava("ER/",er.getId(), er.print());
			System.out.println("Id: "+er.getId()+" "+er.toString());
		}		
		return er;
	}
	
	public void editarER(int id, String novaExpr){
		arq.grava("ER/",id,novaExpr);
		
		System.out.println("ok");
	}
}

